Freemarker 语法简介

您所在的位置:网站首页 freemarker 变量赋值 Freemarker 语法简介

Freemarker 语法简介

#Freemarker 语法简介| 来源: 网络整理| 查看: 265

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。

选择freemarker的原因:性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。宏定义比jsp tag方便内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便支持jsp标签可以实现严格的mvc分离FreeMarker模板文件主要由如下4个部分组成:文本:直接输出的部分。注释:格式部分,不会输出。插值:即${…}或#{…}格式的部分,将使用数据模型中的部分替代输出。FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出。例子 Welcome! Welcome ${user}!

We have these animals: ${being.name} for ${being.price} Euros 一、插值规则

FreeMarker的插值有如下两种类型:

通用插值${expr}数字格式化插值:#{expr}或#{expr;format}1. 通用插值输出 ${book.name}

空值判断:

${book.name?if_exists}${book.name?default(‘xxx’)} //默认值xxx${book.name!"xxx"} //默认值xxx日期格式:${book.date?string('yyyy-MM-dd')}

数字格式:

${book?string.number} //20${book?string.currency} //$20.00${book?string.percent} //20%2. 数字格式化插值

数字格式化插值可采用#{expr;format}形式来格式化数字。

其中format可以是:

mX:小数部分最小X位MX:小数部分最大X位

示例:

#{x; M2} #{y; M2} #{x; m2} #{y; m2} #{x; m1M2} #{x; m1M2}

输出:

2.58 4 2.58 4.00 2.58 2.58二、FTL指令规则

在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.

开始标签:结束标签:空标签:1. 遍历List集合 ${item}

这里会逐个输出星期几。

此外,迭代集合对象时,还包含两个特殊的循环变量:

item_index:当前变量的索引值item_has_next:是否存在下一个对象

也可以使用指令跳出迭代。

2. 遍历map集合{"语文":78, "数学":80}

Map对象的key和value都是表达式,但是key必须是字符串。

${key}=${map[key]} 3. 逻辑判断

if 判断

判断条件,当condition的判断结果为false(布尔值)时,在和标签之间的内容将会被略过。

Pythons are cheaper than elephants today. Pythons are not cheaper than elephants today.

需要注意的是比较运算符两边的类型必须相同,不能一个是 数字,一个是字符串,否则将会报错。

Switch 判断

... ... ... ... 4. 空值处理

FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误。这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变量完全相同。

为了处理缺失变量,FreeMarker提供了两个运算符:

!:指定缺失变量的默认值??:判断某个变量是否存在

指定缺失变量的默认值

!运算符的用法有如下两种:

variable! variable!defaultValue

第一种用法不给缺失的变量指定默认值,表明默认值是空字符串、长度为0的集合或者长度为0的Map对象。

另外,使用!指定默认值时,并不要求默认值的类型和变量类型相同。

Demo:

Welcome ${user!"Anonymous"}! Welcome ${user!"Anonymous"}!

输出:

Welcome Anonymous! Welcome Doe Joe!

判断某个变量是否存在

使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false

但是需要注意的是,我们在使用freemarker获取后端回填数据时,必须使用??来判断是否存在,再进行使用。或者通过default来赋予默认值,否则一旦数据不存在,就会出现前端报错完全崩溃的情况。

Demo:

Mouse found. No mouse found.

实际使用示例:

暂无内容! ${x.title} ${x.title} ¥${x.price} 5. 变量的声明

plain变量

它能从模板中的任何位置来访问,或者从使用include指令引入的模板访问。可以使用assign和macro指令来创建或替换这些变量。

局部变量

只能在#function或#macro定义体中定义&有效,使用local指令创建和替换。

局部变量会隐藏同名的plain变量。

循环变量

只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量。

循环变量会隐藏同名的局部变量和plain变量,且内部循环变量会隐藏外部循环变量。

如果想要跳出作用域,直接使用数据模型中的变量,使用globals关键字即可:

${user} ${.globals.user}

输出:

Joe Doe6. 运算符的优先级

FreeMarker中的运算符优先级如下(由高到低排列):

一元运算符:!内建函数:?乘除法: *, / , % 加减法:- , + 比较: > , = ,


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3